package utils

import (
	"crypto/hmac"
	"crypto/rand"
	"crypto/sha256"
	"encoding/base64"
	"time"
)

// 授权请求数据结构
type AuthRequest struct {
	AuthCode  string `json:"auth_code"` // 授权码
	Encrypted string `json:"encrypted"` // 加密数据(base64)
	Timestamp int64  `json:"timestamp"` // 客户端时间戳
	Nonce     string `json:"nonce"`     // 随机数
	Signature string `json:"signature"` // HMAC签名
}

// 授权响应数据结构
type AuthResponse struct {
	Success   bool   `json:"success"`   // 是否授权成功
	Message   string `json:"message"`   // 消息
	NewKey    string `json:"new_key"`   // 新密钥(base64)
	Signature string `json:"signature"` // 响应签名
}

// 客户端设备信息
type DeviceInfo struct {
	IP        string `json:"ip"`         // IP地址
	MachineID string `json:"machine_id"` // 机器唯一标识
}

const (
	TimeWindow = 2 * time.Minute // 时间窗口
	KeySize    = 32              // AES密钥长度
	NonceSize  = 16              // Nonce长度
)

// 生成随机Nonce
func GenerateNonce() (string, error) {
	b := make([]byte, NonceSize)
	_, err := rand.Read(b)
	if err != nil {
		return "", err
	}
	return base64.URLEncoding.EncodeToString(b), nil
}

// 计算HMAC签名
func ComputeHMAC(data []byte, key []byte) string {
	mac := hmac.New(sha256.New, key)
	mac.Write(data)
	return base64.URLEncoding.EncodeToString(mac.Sum(nil))
}

// 验证HMAC签名
func VerifyHMAC(data []byte, key []byte, signature string) bool {
	expected := ComputeHMAC(data, key)
	return hmac.Equal([]byte(expected), []byte(signature))
}

// AES加密 (简化示例，实际应使用AES-GCM)
func EncryptData(data []byte, key []byte) (string, error) {
	// 实际实现应使用crypto/aes + crypto/cipher的GCM模式
	return base64.URLEncoding.EncodeToString(data), nil
}

// AES解密
func DecryptData(encrypted string, key []byte) ([]byte, error) {
	// 实际实现应使用crypto/aes + crypto/cipher的GCM模式
	return base64.URLEncoding.DecodeString(encrypted)
}

// 生成新密钥
func GenerateNewKey() ([]byte, error) {
	key := make([]byte, KeySize)
	_, err := rand.Read(key)
	if err != nil {
		return nil, err
	}
	return key, nil
}
